﻿using System;
using System.ComponentModel.DataAnnotations;
using System.Net;
using System.Net.Mail;

namespace SingleBlog.Core.SettingModels
{
    /// <summary>
    /// 表示使用 SMTP 发送邮件的配置。
    /// </summary>
    public class SmtpSettingModel : ISettingModel,System.IValidatableModel
    {
        /// <summary>
        /// 获取或设置 SMTP 的主机名称。
        /// </summary>
        /// <remarks>
        /// 126：smtp.126.com
        /// 163：smtp.163.com
        /// ...
        /// </remarks>
        [Display(Name ="主机地址")]
        [Required(ErrorMessage = "{0}是必填项")]
        public string Host { get; set; }

        /// <summary>
        /// 获取或设置 SMTP 的发送端口。默认是25。
        /// </summary>
        [Display(Name = "端口")]
        [Required(ErrorMessage = "{0}是必填项")]
        public int Port { get; set; } = 25;

        /// <summary>
        /// 获取或设置一个布尔值，表示是否启用 SSL 方式发送邮件。
        /// </summary>
        public bool EnableSSL { get; set; }

        /// <summary>
        /// 获取或设置 SMTP 的用户名。
        /// </summary>
        [Display(Name = "用户名")]
        [Required(ErrorMessage = "{0}是必填项")]
        public string UserName { get; set; }

        /// <summary>
        /// 获取或设置 SMTP 的密码。
        /// </summary>
        [Display(Name = "密码")]
        [Required(ErrorMessage = "{0}是必填项")]
        public string Password { get; set; }

        /// <summary>
        /// 获取或设置发信人的邮箱地址。
        /// </summary>
        [Display(Name = "发信人邮箱")]
        [Required(ErrorMessage = "{0}是必填项")]
        [RegularExpression(Const.PATTERN_EMAIL,ErrorMessage ="{0}格式不正确")]
        public string SenderMailAddress { get; set; }

        /// <summary>
        /// 获取或设置发信人的邮箱显示名称。
        /// </summary>
        public string SenderMailName { get; set; }

        /// <summary>
        /// 获取一个设置的键。
        /// </summary>
        public string Key => "Smtp";

        /// <summary>
        /// 获取发信人的 <see cref="MailAddress"/> 对象。
        /// </summary>
        public MailAddress GetSender() => new MailAddress(this.SenderMailAddress, this.SenderMailName.To<string>(string.Empty));

        /// <summary>
        /// 获取 SMTP 的 <see cref="NetworkCredential"/> 对象。
        /// </summary>
        public NetworkCredential GetCredential() => new NetworkCredential(this.UserName, this.Password);

        /// <summary>
        /// 获取 <see cref="SmtpClient"/> 对象已设置好基本配置。
        /// </summary>
        public SmtpClient GetClient() => new SmtpClient(this.Host, this.Port)
        {
            EnableSsl = EnableSSL,
            Credentials = this.GetCredential(),
            Timeout = 10
        };
    }
}
